// fileUpload.js
import { getToken } from '@/utils/auth'
import axios from 'axios'
const basePath = process.env.VUE_APP_BASE_API
/**
 * @description: 文件附件上传
 * file：文件对象
 * type: 是否使用oss
 * successCallback： 成功的回调函数
 * errCallBack： 错误的回调函数
 * progressCallback： 上传进度的回调函数
 */
const upload = function(
  file,
  type,
  successCallback = new Function(),
  errCallBack = new Function(),
  progressCallback = new Function()
) {
  const fileName = file.name
  const fileSize = file.size / 1024 / 1024 // 获取文件大小
  // 小于10mb的文件直接上传服务器，否则通过服务端签名后直传方式
  if (type) {
    const fd = new FormData()
    fd.append('file', file)
    axios({
      url: basePath + '/oss/upload',
      method: 'POST',
      data: fd,
      headers: {
        'timeout': 3 * 60 * 1000,
        'X-JSZS-TOKEN': getToken()
      },
      // 上传进度
      onUploadProgress: function(progressEvent) {
        if (progressEvent.lengthComputable) {
          const percent = (progressEvent.loaded / progressEvent.total) * 100 || 0
          progressCallback({
            percent: percent
          })
        }
      }
    }).then(response => {
      // 拿到结果后，做其他操作
      successCallback({
        name: fileName,
        url: response.data.data,
        size: fileSize,
        status: 200
      })
    }).catch(err => {
      errCallBack(err)
    })
  } else {
    axios({
      method: 'POST',
      url: basePath + '/oss/policy', // 请求签名接口
      headers: {
        'X-JSZS-TOKEN': getToken()
      },
      data: {
        fileName: fileName
      }
    }).then(res => {
      const response = res.data.data
      // 拿到签名信息后，组装表单数据 flag： 0 - minio、1-阿里云、2-腾讯云、3-七牛云
      const config = {
        method: 'POST', // 默认请求方式为post
        host: response.host, // 上传路径
        redirectToPageName: response.fileName, // 返回给页面的文件名
        redirectToPageUrl: response.redirectUrl // 返回给页面的重定向文件地址
      }
      const fd = new FormData()
      if (response.flag === 1) {
        config.policy = response.policy
        config.Signature = response.signature
        config.OSSAccessKeyId = response.accessKey
        config.key = response.dir + response.fileName
        config.dir = response.dir

        fd.append('policy', config.policy)
        fd.append('Signature', config.Signature)
        fd.append('OSSAccessKeyId', config.OSSAccessKeyId)
        fd.append('key', config.key)
        fd.append('dir', config.dir)
        fd.append('host', config.host)
        fd.append('file', file)
      } else {
        config.method = 'PUT' // minio要求请求方式为put
      }

      // 发送请求上传到阿里云oss
      axios({
        url: config.host,
        method: config.method,
        data: response.flag === 1 ? fd : file,
        processData: false,
        cache: false,
        contentType: false,
        // 上传进度
        onUploadProgress: function(progressEvent) {
          if (progressEvent.lengthComputable) {
            const percent = (progressEvent.loaded / progressEvent.total) * 100 || 0
            progressCallback({
              percent: percent
            })
          }
        }
      }).then(() => {
        // 拿到结果后，做其他操作
        successCallback({
          name: config.redirectToPageName,
          url: config.redirectToPageUrl,
          // size: fileSize,
          status: 200
        })
      }).catch(err => {
        errCallBack(err)
      })
    }).catch(err => {
      errCallBack(err)
    })
  }
}
export default upload
